不使用运算符 + 和 - ,计算两整数 a 、b 之和。

示例 1:

输入: a = 1, b = 2
输出: 3
示例 2:

输入: a = -2, b = 3
输出: 1

一开始看到这个两数相加我笑了,无非是return a+b嘛,但是看到不使用运算符+-的时候我蒙圈了,?!,纳尼?

于是我试着提交了一下return a+b

居然过了哈哈哈哈

算了不耍无赖,正经看题,不准用+-,那就只能用位运算了呗

5 = 101

3 = 011

2 = 010

需要找到一种位运算,在不进位的情况下满足1?1=0,1?0=1,0?0=0这个运算符就是xor,然后考虑进位的问题

如果是进位的话,考虑一下情况

7 = 111

7 = 111

14 = 1110

使用xor得到的结果111 xor 111 = 0 ,而``111 and 111 = 111`,所以,a+b = (a xor b)+(a&b << 1)

写个迭代试试

1
2
3
4
5
6
7
def getSum(a,b):
jin = (a&b)<<1
zheng = (a^b)
if(jin==0):
return zheng
else:
return getSum(jin,zheng)

然而出现了一个问题,python里面计算负数出了问题

我试着输出一下python里面负数的表示

print(hex(-1)) 发现出来的结果是'-0x1'没有说是类似FFFFFFFF的表达

于是查找题解,发现python是需要模拟32位溢出的情况,魔改代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def getSum(a,b):
jin = (a&b)<<1
zheng = (a^b)
MASK = 0x100000000
MAX_INT = 0x7FFFFFFF
MIN_INT = MAX_INT + 1
jin = jin % MASK
zheng = zheng %MASK
if(jin==0):
if(zheng>>28==0xf):
zheng^=0xffffffff
zheng = ~zheng
return zheng
return zheng
else:
return getSum(jin,zheng)

后来又发现python这个弄出来全部都是无符号整数 然后强制转化成带符号整数进行输出就可以了